#!/usr/bin/env python

import subprocess
import sys

from methods import print_warning

Import("env")

android_files = [
    "os_android.cpp",
    "android_input_handler.cpp",
    "file_access_android.cpp",
    "file_access_filesystem_jandroid.cpp",
    "audio_driver_opensl.cpp",
    "dir_access_jandroid.cpp",
    "tts_android.cpp",
    "thread_jandroid.cpp",
    "net_socket_android.cpp",
    "java_godot_lib_jni.cpp",
    "java_class_wrapper.cpp",
    "java_godot_wrapper.cpp",
    "java_godot_view_wrapper.cpp",
    "java_godot_io_wrapper.cpp",
    "jni_utils.cpp",
    "android_keys_utils.cpp",
    "display_server_android.cpp",
    "plugin/godot_plugin_jni.cpp",
    "rendering_context_driver_vulkan_android.cpp",
]

env_android = env.Clone()

android_objects = []
for x in android_files:
    android_objects.append(env_android.SharedObject(x))

env_thirdparty = env_android.Clone()
env_thirdparty.disable_warnings()
thirdparty_obj = env_thirdparty.SharedObject("#thirdparty/misc/ifaddrs-android.cc")
android_objects.append(thirdparty_obj)

lib = env_android.add_shared_library("#bin/libgodot", [android_objects], SHLIBSUFFIX=env["SHLIBSUFFIX"])

# Needed to force rebuilding the platform files when the thirdparty code is updated.
env.Depends(lib, thirdparty_obj)

lib_arch_dir = ""
if env["arch"] == "arm32":
    lib_arch_dir = "armeabi-v7a"
elif env["arch"] == "arm64":
    lib_arch_dir = "arm64-v8a"
elif env["arch"] == "x86_32":
    lib_arch_dir = "x86"
elif env["arch"] == "x86_64":
    lib_arch_dir = "x86_64"
else:
    print_warning("Architecture not suitable for embedding into APK; keeping .so at \\bin")

if lib_arch_dir != "":
    if env.dev_build:
        lib_type_dir = "dev"
    elif env.debug_features:
        if env.editor_build and env["store_release"]:
            lib_type_dir = "release"
        else:
            lib_type_dir = "debug"
    else:  # Release
        lib_type_dir = "release"

    if env.editor_build:
        lib_tools_dir = "tools/"
    else:
        lib_tools_dir = ""

    out_dir = "#platform/android/java/lib/libs/" + lib_tools_dir + lib_type_dir + "/" + lib_arch_dir
    env_android.Command(
        out_dir + "/libgodot_android.so", "#bin/libgodot" + env["SHLIBSUFFIX"], Move("$TARGET", "$SOURCE")
    )

    stl_lib_path = (
        str(env["ANDROID_NDK_ROOT"]) + "/sources/cxx-stl/llvm-libc++/libs/" + lib_arch_dir + "/libc++_shared.so"
    )
    env_android.Command(out_dir + "/libc++_shared.so", stl_lib_path, Copy("$TARGET", "$SOURCE"))

    def generate_apk(target, source, env):
        gradle_process = []

        if sys.platform.startswith("win"):
            gradle_process = [
                "cmd",
                "/c",
                "gradlew.bat",
            ]
        else:
            gradle_process = ["./gradlew"]

        if env["target"] != "editor" and env["dev_build"]:
            subprocess.run(
                gradle_process
                + [
                    "generateDevTemplate",
                    "--quiet",
                ],
                cwd="platform/android/java",
            )
        else:
            # Android editor with `dev_build=yes` is handled by the `generateGodotEditor` task.
            subprocess.run(
                gradle_process
                + [
                    "generateGodotEditor" if env["target"] == "editor" else "generateGodotTemplates",
                    "--quiet",
                ],
                cwd="platform/android/java",
            )

    if env["generate_apk"]:
        generate_apk_command = env_android.Command("generate_apk", [], generate_apk)
        command = env_android.AlwaysBuild(generate_apk_command)
        env_android.Depends(command, [lib])
